

#include <iostream>
#include <stdio.h>
using namespace std;

typedef int TElemType;

struct BiNode { //原始二叉链表
  TElemType data;
  struct BiNode *lchild;
  struct BiNode *rchild;
};

typedef enum { Link, Thread } PointerTag;

struct BiThrNode1 { //线索二叉树不加左右标志  和原始的二叉树没有区别
  TElemType data;
  struct BiThrNode1 *lchild;
  struct BiThrNode1 *rchild;
};

struct BiThrNode {          //线索二叉树加左右标志
  TElemType data;           //数据域
  struct BiThrNode *lchild; //左右孩子指针
  struct BiThrNode *rchild; //左右标志
  PointerTag LTag;          //左右标志
  PointerTag RTag;
};

int main() {
  int a = 1;
  char b = 'a';
  float c = 1.0;
  void *p;

  printf("int型变量所占用的大小(字节)：%d\n", sizeof(int));
  printf("float型变量所占用的大小(字节)：%d\n", sizeof(float));
  printf("char型变量所占用的大小(字节)：%d\n", sizeof(char));
  printf("C++支持（C语言不支持）：boolean型变量所占用的大小(字节)：%d\n",
         sizeof(bool));
  printf("unsigned int型变量所占用的大小(字节)：%d\n", sizeof(unsigned int));
  printf("short型变量所占用的大小(字节)：%d\n", sizeof(short));

  p = &a; //指针变量
  printf("指向int型变量的指针变量所占用的大小(字节)：%d\n", sizeof(p));
  p = &b;
  printf("指向char型变量的指针变量所占用的大小(字节)：%d\n", sizeof(p));
  p = &c;
  printf("指向float型变量的指针变量所占用的大小(字节)：%d\n", sizeof(p));
  printf("枚举类型所占用的大小(字节)：%d\n", sizeof(PointerTag));
  printf("原始的二叉链表结点大小（字节）：%d\n", sizeof(struct BiNode));
  printf("线索二叉树结点（不加标志位）大小（字节）：%d\n",
         sizeof(struct BiThrNode1));
  printf("线索二叉树结点（加标志位）大小（字节）：%d\n",
         sizeof(struct BiThrNode));

  int tagsize = (sizeof(struct BiThrNode) - sizeof(struct BiThrNode1)) /
                2; //其实就是PointerTag型变量的字节数
  printf("标志位在结构体中的大小（字节）：%d\n", tagsize);

  PointerTag pt1 = Link;
  PointerTag pt2 = Link;

  printf("&pt1 =%d,&pt2 =%d\n", &pt1, &pt2); //&表示取地址  *表示由地址取值

  return 0;
} // main